let rec power x n =
  match n with
  |0 -> 1
  |_ -> x * (power  x (n-1));;

let rec application l1 x = match l1 with
    []   -> 0
  | (e1,e2)::l ->  e1 *(power x e2) + application l x;;

let rec add l1 l2 = match (l1,l2) with
  | ([],[]) -> []
  | ([],l2) -> l2
  | (l1,[]) -> l1
  | (((e1,e2)::liste1),(e3,e4)::liste2) ->
    if e2=e4 then 
      if e1+e3=0 then (add liste1 liste2)
      else(e1+e3,e2)::(add liste1 liste2)
    else 
      if e2<e4 then (e1,e2)::(e3,e4)::(add liste1 liste2)
      else (e3,e4)::(e1,e2)::(add liste1 liste2);;

let rec soustract l1 l2 =  match (l1,l2) with
  | ([],[]) -> []
  | ([],l2) -> l2
  | (l1,[]) -> l1
  | (((e1,e2)::liste1),(e3,e4)::liste2) ->

    if e2=e4 then 
      if e1-e3=0 then (soustract liste1 liste2) 
      else(e1-e3,e2)::(soustract liste1 liste2) 

    else 
      if e2<e4 then (e1,e2)::(-e3,e4)::(soustract liste1 liste2)
      else (-e3,e4)::(e1,e2)::(soustract liste1 liste2);;

let rec deriv = function
   [] -> []
  | (e1,e2)::l -> (e1*e2,e2-1)::(deriv l);;
